﻿Imports Commander_Wars.Spieletools
''' <summary>
''' Eine einfache KI mit verbesserten Funktionen.
''' Sie kann Gebäude und Transporter benutzen.
''' Sie greift aber keine Spezialgebäude an.
''' </summary>
''' <remarks></remarks>
Public Class KIEinfach
    Inherits ObjektKI
    Const AllesBauSumme As Integer = 20000
    Const BilligsterPanzer As Integer = 6000
    Const TeuersterPanzer As Integer = 11000
    Dim Infis As Integer
    Dim TTPs As Integer
    Dim LBoote As Integer
    Dim THelis As Integer
    Dim Späher As Integer
    Public Sub New(ByVal neuSpieler As ObjektSpieler)
        MyBase.New(neuSpieler, 1, 1, 0.5#, Besetzungsprioritäten.Keine, GeldTPAngriffsModus.NurGeld, 0, 0, 0, -1)

        StartNeuerKIThreat()
    End Sub
    ''' <summary>
    ''' Führt die Zug bewegungen der Kinderleichten KI aus. Muahaha und dann Boom.Diese KI kann keine Gebäude bedinnen
    ''' </summary>
    ''' <remarks></remarks>
    Public Overrides Sub KISchleife()
        Objektverwalter.Spielfeld.EingabenErlauben = False
        KIWarten(12)
        While Schleife = False
            MomentaneEinheit = 0
            Select Case KIModusIntern
                Case KIModiIntern.KIStart
                    GabenEinsetzen()
                Case KIModiIntern.StartWarten
                    KIModusIntern = KIModiIntern.GebäudeAngriff
                Case KIModiIntern.GebäudeAngriff
                    GebäudeFeuer()
                Case KIModiIntern.ExternGesteuerteEinheiten
                    ExternGesteurteEinheiten()
                Case KIModiIntern.Besetzen
                    Besetzen()
                Case KIModiIntern.HölliumZiehen
                    HölliumZiehen()
                Case KIModiIntern.Fernkampf
                    FernkampfAngriff()
                Case KIModiIntern.Nahkampf
                    NahkampfAngriff()
                Case KIModiIntern.Nahkampfziehen
                    NahkampfZiehen()
                Case KIModiIntern.Infanterieziehen
                    InfanterieZiehen() 'UV
                Case KIModiIntern.Fernkampfziehen
                    Fernkampfziehen()
                Case KIModiIntern.TransporterVerladen
                    EinheitenVerladen()
                    KIModusIntern = KIModiIntern.Transproterziehen
                Case KIModiIntern.Transproterziehen
                    TransporterZiehen(EinheitenSortierKriterien.Zufall)
                    KIModusIntern = KIModiIntern.Bauen
                Case KIModiIntern.Bauen
                    GetAllBuildings()
                    Bauen() 'UV
                Case KIModiIntern.RundenEnde
                    RundenEnde()
            End Select
        End While
    End Sub
    ''' <summary>
    ''' So werden zu beginn Gaben einer einfachen KI eingesetzt.
    ''' Es wird nicht überprüft ob der Einsatz der Gabe bzw. Spezialgabe sinnvoll ist.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub GabenEinsetzen()
        If Spieler.VeränderteWerte.Gabeeinsatz = True Then
            Dim GabefüllstandKO1 As Integer = Spieler.KOS(0).Gabeleiste
            Dim GabefüllstandKO2 As Integer = -1
            If IsNothing(Spieler.KOS(1)) = False Then
                GabefüllstandKO2 = Spieler.KOS(1).Gabeleiste
            End If
            If GabefüllstandKO1 > Spieler.KOS(0).Gabekosten * Spieler.KOS(0).Sternkosten + Spieler.KOS(0).Sternkosten / 2 Then
                If GabefüllstandKO1 >= (Spieler.KOS(0).Gabekosten + Spieler.KOS(0).SpezialgabeKosten) * Spieler.KOS(0).Sternkosten Then
                    If IsNothing(Spieler.KOS(1)) = False Then
                        If GabefüllstandKO2 >= (Spieler.KOS(1).SpezialgabeKosten + Spieler.KOS(1).Gabekosten) * Spieler.KOS(1).Sternkosten Then
                            'Die Doppelgabe kommt euer untergang ist nah Muahaha
                            Spieler.KOS(0).Doppelgabe()
                        ElseIf GabefüllstandKO2 <= (Spieler.KOS(1).SpezialgabeKosten + Spieler.KOS(1).Gabekosten) * Spieler.KOS(1).Sternkosten - Spieler.KOS(1).Sternkosten * 3 Then
                            'Die KI setzt die Spezialgabe ein
                            If Spieler.KOS(0).KannSpezialGabe Then
                                Spieler.KOS(0).Spezialgabe()
                            End If
                        End If
                    Else
                        'Die KI setzt die Spezialgabe ein
                        If Spieler.KOS(0).KannSpezialGabe Then
                            Spieler.KOS(0).Spezialgabe()
                        End If
                    End If
                End If
            ElseIf GabefüllstandKO1 > Spieler.KOS(0).Gabekosten * Spieler.KOS(0).Sternkosten Then
                'Die KI setzt die Gabe ein
                If Spieler.KOS(0).KannGabe Then
                    Spieler.KOS(0).Gabe()
                End If
            End If
        End If
        KIModusIntern = KIModiIntern.StartWarten
        KIWarten(8)
    End Sub
    ''' <summary>
    ''' Lässt die Gebäude feuern
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub GebäudeFeuer()
        Dim NewUnits As Boolean = False
        While MomentaneEinheit < Gebäude.Length
            Dim MomGebäude As ObjektGebäude = Gebäude(MomentaneEinheit)
            If Not MomGebäude.GetRealGebäudeID = "VERWEIS" Then
                If MomGebäude.Feuerbereit = 0 Then
                    If TypeOf MomGebäude Is GebäudeLaser Then
                        GebäudeAuswählen(KIModiExtern.Schuss, MomGebäude, New EinheitAmphibienpanzer(0, 1, 1, False), 4)
                    ElseIf TypeOf MomGebäude Is GebäudeOmega_Rakete Then
                        Dim Omega As GebäudeOmega_Rakete = MomGebäude
                        If Omega.RaketeFeuerbereit = True Then
                            Dim Ziel As Point = GetBestenEinschlagsOrt(Omega.Reichweite, Omega.Schaden)
                            If Ziel.X >= 0 Then
                                GebäudeAuswählen(KIModiExtern.OmegaRaketeStarten, Omega, New EinheitArtillerie(0, Ziel.X, Ziel.Y), 4)
                            End If
                        ElseIf Spieler.Fonds > 30000 Then
                            For I = 0 To Omega.Variablen.Length - 1
                                If Omega.Variablen(I).Wert = 1 Then
                                    'Wir bauen einen Teil der Omega-Rakete
                                    GebäudeAuswählen(KIModiExtern.OmegaUpgradeKaufen, Omega, New EinheitArtillerie(0, I, 0), 4)
                                    Exit For
                                End If
                            Next
                        End If
                    Else
                        Dim Ziel As Point = GetBestesGebäudeFeuer(MomGebäude)
                        If Ziel.X >= 0 And Ziel.Y >= 0 Then
                            If MomGebäude.Angriff = ObjektGebäude.Angriffe.SchussN Or MomGebäude.Angriff = ObjektGebäude.Angriffe.SchussW Or MomGebäude.Angriff = ObjektGebäude.Angriffe.SchussS Or MomGebäude.Angriff = ObjektGebäude.Angriffe.SchussO Then
                                GebäudeAuswählen(KIModiExtern.Schuss, MomGebäude, Objektverwalter.Spielfeld.Einheiten(Ziel.X, Ziel.Y, Schlachtfeld), 4)
                            Else
                                'Wir müssen erst noch eine virtuelle Einheit erschaffen.=)
                                GebäudeAuswählen(KIModiExtern.Schuss, MomGebäude, New EinheitAmphibienpanzer(0, Ziel.X, Ziel.Y, False), 4)
                            End If
                        End If
                    End If
                ElseIf MomGebäude.GebäudeID = "FABRIK" Then
                    Dim BauEinheiten As String() = BestesGeldAusgebenBeiFabrik(MomGebäude)
                    Dim Y As Integer = MomGebäude.Rechteck.Y + 2
                    Dim X As Integer = MomGebäude.Rechteck.X - 1
                    For I = 0 To BauEinheiten.Length - 1
                        If Not BauEinheiten(I) = "" Then
                            GebäudeAuswählen(KIModiExtern.FabrikBauen, MomGebäude, ObjektLadeklasse.NewEinheit(BauEinheiten(I), Spieler.Spieler, X, Y), 4)
                            NewUnits = True
                        End If
                        X += 1
                    Next
                End If
            End If
            MomentaneEinheit += 1
        End While
        If NewUnits Or Einheiten.Length = 0 Then
            GetAllUnits(EinheitenSortierKriterien.Zufall)
        End If
        KIModusIntern = KIModiIntern.ExternGesteuerteEinheiten
    End Sub
    ''' <summary>
    ''' Mit dieser Funktion Suchen sich die Einfachen KI's die Gebäude aus die sie besetzen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Besetzen()
        KOEinheitErschaffen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                Dim Einheit As Integer = MomentaneEinheit
                If Einheiten(Einheit).KannBesetzen = True Then
                    If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                        Dim WSS As Wegsuchsystem = CreateWSS(Einheiten(Einheit))
                        If Einheiten(Einheit).Besetzen = True Then
                            'Diese Einheit besetzt gerade ein Gebäude da macht sie damit gleich weiter
                            Einheitauswählen(Einheiten(Einheit), New Point(Einheiten(Einheit).X, Einheiten(Einheit).Y), KIModiExtern.Besetzen, Nothing, WSS, 4)
                        ElseIf Einheiten(Einheit).KannBesetzen = True Then
                            Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Einheiten(Einheit).X, Einheiten(Einheit).Y, Schlachtfeld).Gebäude
                            If G Is Nothing Then
                                Dim Ziel As Point = GetWeitestesBesetzungsFeld(Einheiten(Einheit), WSS)
                                If Ziel.X >= 0 Then
                                    'Diese KI sucht noch nicht nach dem Besten Gebäude sondern besetzt das erst beste
                                    WSS.Ziel(Ziel.X, Ziel.Y, True)
                                    Dim Bes As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Ziel.X, Ziel.Y, Schlachtfeld).Gebäude
                                    If Bes.Angriff = ObjektGebäude.Angriffe.Silo Then
                                        Dim Ziel2 As Point = GetBestenEinschlagsOrt(Bes.Reichweite, Bes.Schaden)
                                        Einheitauswählen(Einheiten(Einheit), Ziel, KIModiExtern.SiloZünden, New EinheitAmphibienpanzer(0, Ziel2.X, Ziel2.Y), WSS, 4)
                                    Else
                                        Einheitauswählen(Einheiten(Einheit), Ziel, KIModiExtern.Besetzen, Nothing, WSS, 4)
                                    End If
                                End If
                            ElseIf G.IsBesetzung(Spieler.Spieler) = True Then
                                Dim Ziel As New Point(Einheiten(Einheit).X, Einheiten(Einheit).Y)
                                If G.Angriff = ObjektGebäude.Angriffe.Silo Then
                                    Dim Ziel2 As Point = GetBestenEinschlagsOrt(G.Reichweite, G.Schaden)
                                    Einheitauswählen(Einheiten(Einheit), Ziel, KIModiExtern.SiloZünden, New EinheitAmphibienpanzer(0, Ziel2.X, Ziel2.Y), WSS, 4)
                                Else
                                    Einheitauswählen(Einheiten(Einheit), Ziel, KIModiExtern.Besetzen, Nothing, WSS, 4)
                                End If
                            Else
                                Dim Ziel As Point = GetWeitestesBesetzungsFeld(Einheiten(Einheit), WSS)
                                If Ziel.X >= 0 Then
                                    'Diese KI sucht noch nicht nach dem Besten Gebäude sondern besetzt das erst beste
                                    WSS.Ziel(Ziel.X, Ziel.Y, True)
                                    Dim Bes As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Ziel.X, Ziel.Y, Schlachtfeld).Gebäude
                                    If Bes.Angriff = ObjektGebäude.Angriffe.Silo Then
                                        Dim Ziel2 As Point = GetBestenEinschlagsOrt(Bes.Reichweite, Bes.Schaden)
                                        Einheitauswählen(Einheiten(Einheit), Ziel, KIModiExtern.SiloZünden, New EinheitAmphibienpanzer(0, Ziel2.X, Ziel2.Y), WSS, 4)
                                    Else
                                        Einheitauswählen(Einheiten(Einheit), Ziel, KIModiExtern.Besetzen, Nothing, WSS, 4)
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.HölliumZiehen
    End Sub
    ''' <summary>
    ''' Zieht die Hölliums des Spielers
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub HölliumZiehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).HatsichBewegt = False Then
                    If Einheiten(MomentaneEinheit).EinheitenID = MovementSorts.HÖLLIUM.tostring.toupper Then
                        'Wir haben ein Höllium zum ziehen.=)
                        Dim Höllium As ObjektEinheit = Einheiten(MomentaneEinheit)
                        Dim WSS As New Wegsuchsystem(Höllium, Höllium.X, Höllium.Y, Höllium.GetMap, -1)
                        Dim Ziel As Point = GetNähestesHölliumZiel(Höllium, WSS)
                        If Ziel.X >= 0 Then
                            Einheitauswählen(Höllium, Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Fernkampf
    End Sub
    ''' <summary>
    ''' Führt die Fernkämpfe der einfachen KI aus.
    ''' Diese KI haut mit ihren Fernwaffen in keinem Fall ab.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub FernkampfAngriff()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                Dim E As ObjektEinheit = Einheiten(MomentaneEinheit)
                If E.HatsichBewegt = False Then
                    If E.MaximaleReichweite > 1 Then
                        Dim WSS As Wegsuchsystem = CreateWSS(E)
                        'OH je  das wird noch komplikate
                        If E.CanIndirectMoveAndFire = True And Spieler.KOS(0).FireandMove = True Then
                            Dim Feld As Point = GetBestesFernkampfOpfer(E)
                            If Feld.X >= 0 Then
                                Einheitauswählen(E, New Point(E.X, E.Y), KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.X, Feld.Y, Schlachtfeld), WSS)
                                Dim Felder As Point2 = GetBestesFernkampfFeldmitBewegung(E, WSS)
                                If Felder.Point1.X >= 0 And Felder.Point2.X >= 0 Then
                                    'So wir haben ein Opfer.
                                    NächsterBefehl(Felder.Point1, Objektverwalter.Spielfeld.Einheiten(Felder.Point2.X, Felder.Point2.Y, Schlachtfeld), KIModiExtern.Angriff, WSS, 4)
                                End If
                            Else
                                Dim Felder As Point2 = GetBestesFernkampfFeldmitBewegung(E, WSS)
                                If Felder.Point1.X >= 0 And Felder.Point2.X >= 0 Then
                                    'So wir haben ein Opfer.
                                    Einheitauswählen(E, Felder.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Felder.Point2.X, Felder.Point2.Y, Schlachtfeld), WSS)
                                End If
                            End If
                            EinheitAbwählen()
                        ElseIf E.CanIndirectMoveAndFire Then
                            'Ein Angriff ziehen und Feuern wie beim Nahkampf
                            Dim Felder As Point2 = GetBestesFernkampfFeldmitBewegung(E, WSS)
                            If Felder.Point1.X >= 0 And Felder.Point2.X >= 0 Then
                                'So wir haben ein Opfer.
                                Einheitauswählen(E, Felder.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Felder.Point2.X, Felder.Point2.Y, Schlachtfeld), WSS)
                            End If
                        ElseIf Spieler.KOS(0).FireandMove = True Then
                            'Wir suchen uns ein Opfer
                            Dim Feld As Point = GetBestesFernkampfOpfer(E)
                            If Feld.X >= 0 Then
                                Einheitauswählen(E, New Point(E.X, E.Y), KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.X, Feld.Y, Schlachtfeld), WSS)
                            End If
                            'wir haben unser Opfer angegriffen jetzt sollten wir die Einheit noch ziehen.
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Einheiten(MomentaneEinheit).GetMap, -1)
                            Dim Ziel As Point = GetNähestesFernkampffeld(E, WSS)
                            If Ziel.X >= 0 Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
                                    Einheitauswählen(E, New Point(E.X, E.Y), KIModiExtern.Warten, Nothing, WSS)
                                Else
                                    NächsterBefehl(Ziel, Nothing, KIModiExtern.Warten, WSS, 4)
                                End If
                            Else
                                EinheitAbwählen()
                            End If
                        Else
                            'Das ist mir die liebste und einfachst Situation Uff.
                            Dim Feld As Point = GetBestesFernkampfOpfer(E)
                            If Feld.X >= 0 Then
                                Einheitauswählen(E, New Point(E.X, E.Y), KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.X, Feld.Y, Schlachtfeld), WSS, 4)
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Nahkampf
    End Sub
    ''' <summary>
    ''' So ziehen einfache KI's in den Nahkampf
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub NahkampfAngriff()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).HatsichBewegt = False Then
                    If Einheiten(MomentaneEinheit).KannBesetzen = False Then
                        If Einheiten(MomentaneEinheit).MinimaleReichweite = 1 Or Not Einheiten(MomentaneEinheit).Waffe1 = "Keine" Then
                            Dim WSS As Wegsuchsystem = CreateWSS(Einheiten(MomentaneEinheit))
                            Dim Feld As Point2 = GetBestesNahkampfOpfer(Einheiten(MomentaneEinheit), WSS)
                            If Feld.Point1.X >= 0 And Feld.Point2.X >= 0 Then
                                Einheitauswählen(Einheiten(MomentaneEinheit), Feld.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.Point2.X, Feld.Point2.Y, Schlachtfeld), WSS, 4)
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Nahkampfziehen
    End Sub
    ''' <summary>
    ''' So werden die Einheiten  von einfachen KI's zum Ziel geführt
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub NahkampfZiehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                    If Einheiten(MomentaneEinheit).MinimaleReichweite = 1 Or Not Einheiten(MomentaneEinheit).Waffe1 = "Keine" Then
                        If Einheiten(MomentaneEinheit).KannBesetzen = False Then
                            'So das ist vieleicht eine Nahkampfeinheit und zwar kein Infaterist
                            'und diese Einheit kann nicht Angreifen oder doch nah ja das ist ja eine doofe KI
                            'Also keine Abfrage!
                            Dim WSS As New Wegsuchsystem(Einheiten(MomentaneEinheit), Einheiten(MomentaneEinheit).X, Einheiten(MomentaneEinheit).Y, Einheiten(MomentaneEinheit).GetMap, -1)
                            Dim Ziel As Point = GetNähestenNahkampfFeind(Einheiten(MomentaneEinheit), WSS)
                            If Ziel.X >= 0 Then
                                Einheitauswählen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                            Else
                                Ziel = ZumNähestenHQZiehen(Einheiten(MomentaneEinheit), WSS)
                                If Ziel.X > 0 Then
                                    Einheitauswählen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Infanterieziehen
    End Sub
    ''' <summary>
    ''' So ziehen die Infanteristen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub InfanterieZiehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                    If Einheiten(MomentaneEinheit).KannBesetzen Then
                        If Not Einheiten(MomentaneEinheit).Waffe1 = "Keine" Or Einheiten(MomentaneEinheit).MinimaleReichweite = 1 Then
                            Dim WSS As Wegsuchsystem = Nothing
                            Dim Ziel As Point2 = GetBestesNahkampfOpfer(Einheiten(MomentaneEinheit), WSS)
                            If Ziel.Point1.X >= 0 And Ziel.Point2.X >= 0 Then
                                Einheitauswählen(Einheiten(MomentaneEinheit), Ziel.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Ziel.Point2.X, Ziel.Point2.Y, Schlachtfeld), WSS, 4)
                            Else
                                'wir schauen ob wir zu einer Besetzung gehen

                                If InfantrieMoveToTransporterOrBesetzung(Einheiten(MomentaneEinheit)) Then
                                    Exit Sub
                                Else
                                    WSS = New Wegsuchsystem(Einheiten(MomentaneEinheit), , True)
                                    'Wir gehen zu einem Feind.
                                    Dim Zielpunkt As Point = GetNähestenNahkampfFeind(Einheiten(MomentaneEinheit), WSS)
                                    If Zielpunkt.X >= 0 Then
                                        Einheitauswählen(Einheiten(MomentaneEinheit), Zielpunkt, KIModiExtern.Warten, Nothing, WSS)
                                    Else
                                        Dim Z As Point = ZumNähestenHQZiehen(Einheiten(MomentaneEinheit), WSS)
                                        If Z.X > 0 Then
                                            Einheitauswählen(Einheiten(MomentaneEinheit), Z, KIModiExtern.Warten, Nothing, WSS, 4)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Fernkampfziehen
    End Sub
    ''' <summary>
    ''' So werden die Fernkampf Einheiten der Kinderleichten KI gezogen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Fernkampfziehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                    If Einheiten(MomentaneEinheit).MaximaleReichweite > 1 Then
                        Dim WSS As New Wegsuchsystem(Einheiten(MomentaneEinheit), Einheiten(MomentaneEinheit).X, Einheiten(MomentaneEinheit).Y, Einheiten(MomentaneEinheit).GetMap, -1)
                        Dim Ziel As Point = GetNähestesFernkampffeld(Einheiten(MomentaneEinheit), WSS)
                        If Ziel.X >= 0 Then
                            Einheitauswählen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                        Else
                            Ziel = ZumNähestenHQZiehen(Einheiten(MomentaneEinheit), WSS)
                            If Ziel.X > 0 Then
                                Einheitauswählen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.TransporterVerladen
    End Sub
    ''' <summary>
    ''' Lässt die KI Truppen bauen.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Bauen()
        TrimGebäude()
        Gebäude = SortGebäude(Gebäude, GebäudeSortierKriterien.Zufall)
        If Spieler.Bauprioritäten IsNot Nothing Then
            KIGenerellerSuperBau.Bauen(Gebäude, Spieler.Bauprioritäten)
        Else
            'Erst mal Zählen wir die Zahl von bestimmten Einheiten.
            Infis = CountInfanteristen() 'Wie viele Infis haben wir?
            TTPs = CountAnyUnit("TTP") 'Wie viele TTPs?
            LBoote = CountAnyUnit("L-BOOT") 'Wie viele LandeBoote?
            THelis = CountAnyUnit("T-HELI") 'Wie viele T-Helis?
            Späher = CountAnyUnit("SPÄHER") 'Wie viele Späher?
            Dim DurchGänge As Integer = 0
            If Spieler.VeränderteWerte.KeinBau = False Then
                While MomentaneEinheit < Gebäude.Length
                    Dim BauGebäude As ObjektGebäude = Gebäude(MomentaneEinheit)
                    If Objektverwalter.Spielfeld.Einheiten(BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y, Schlachtfeld) Is Nothing Then
                        If BauGebäude.GetBauliste(BauGebäude.Spieler).Length > 0 Then
                            'auf dem Feld ist keine Einheit und das Gebäude kann Einheiten bauen
                            If Infis < 5 And CanBuildInfi(BauGebäude) = True Then
                                'Wir bauen Infanteristen.
                                InfisBauen(BauGebäude)
                            ElseIf TTPs < 1 And Infis >= 5 And BauGebäude.CanBuildUnit("TTP") Then
                                'Wir bauen einen TTP
                                GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, New EinheitTTP(Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y), 4)
                                TTPs += 1
                            ElseIf THelis < 1 And Infis >= 5 And BauGebäude.CanBuildUnit("T-HELI") Then
                                'Wir bauen einen T-Heli
                                GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, New EinheitTransporthelikopter(Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y), 4)
                                THelis += 1
                            ElseIf Infis >= 5 And LBoote < 2 And BauGebäude.CanBuildUnit("L-BOOT") Then
                                'Wir baut ein L-Boot
                                GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, New EinheitL_Boot(Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y), 4)
                                LBoote += 1
                            ElseIf Infis >= 5 And TTPs >= 1 And Späher < 1 And BauGebäude.CanBuildUnit("SPÄHER") Then
                                GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, New EinheitSpäher(Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y), 4)
                                Späher += 1
                            ElseIf Spieler.Fonds > AllesBauSumme And Objektverwalter.Spielfeld.Runde > 1 Then
                                CreatePanzerFlugzeuge(BauGebäude)
                            ElseIf Infis >= 5 And TTPs >= 1 And THelis >= 1 Then
                                'Wir bauen Panzer und Flugzeuge und Schiffe.
                                CreatePanzerFlugzeuge(BauGebäude)
                            ElseIf Infis >= 5 And TTPs >= 1 And Spieler.Fonds >= BilligsterPanzer And BauGebäude.GetBauliste(Spieler.Spieler).Contains("INF") Then
                                'Wir bauen einen Panzer.
                                CreatePanzerFlugzeuge(BauGebäude)
                            End If
                        End If
                    End If
                    MomentaneEinheit += 1
                    If MomentaneEinheit >= Gebäude.Length Then
                        'wir sind alle Gebäude einmal Durchgegangen evtl. gehen wir sie noch mal durch.
                        If Spieler.Fonds > BilligsterPanzer And DurchGänge < 10 Then
                            MomentaneEinheit = 0
                            DurchGänge += 1
                        End If
                    End If
                End While
            End If
        End If
        MomentaneEinheit = 0
        If Schlachtfeld = ObjektSpielfeld.Bodenschlacht And Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            Schlachtwechsel(EinheitenSortierKriterien.Zufall)
            KIModusIntern = KIModiIntern.StartWarten
        Else
            'Wir beenden.
            KIModusIntern = KIModiIntern.RundenEnde
        End If
    End Sub
    ''' <summary>
    ''' Baut einen Infi Mech oder Scharfschützen irgendetwas, das besetzen kann.;)
    ''' </summary>
    ''' <param name="BauGebäude"></param>
    ''' <remarks></remarks>
    Private Sub InfisBauen(ByVal BauGebäude As ObjektGebäude)
        Dim Infis As String() = GetBuildInfis(BauGebäude)
        If CanMoveAfterBuilding(New EinheitInfanterie(0, 0, 0), BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y) = True Then
            If Zufallszahl(1, 100) < 70 Then
                Dim BilligsteTruppe As ObjektEinheit = Nothing
                For I2 = 0 To Infis.Length - 1
                    Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(Infis(I2), Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y)
                    If BilligsteTruppe Is Nothing Then
                        BilligsteTruppe = E
                    ElseIf E.Kosten < BilligsteTruppe.Kosten Then
                        BilligsteTruppe = E
                    ElseIf E.Kosten = BilligsteTruppe.Kosten And Zufallszahl(0, 2) = 0 Then
                        BilligsteTruppe = E
                    End If
                Next
                'Dann mal los ihr Infis
                GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, BilligsteTruppe)
                Me.Infis += 1
            Else
                If Spieler.Fonds > 4000 And Objektverwalter.Spielfeld.Runde > 1 Then
                    GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, ObjektLadeklasse.NewEinheit(Infis(Zufallszahl(0, Infis.Length - 1)), Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y))
                    Me.Infis += 1
                ElseIf Spieler.Fonds > 10000 And Objektverwalter.Spielfeld.Runde = 1 Then
                    GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, ObjektLadeklasse.NewEinheit(Infis(Zufallszahl(0, Infis.Length - 1)), Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y))
                    Me.Infis += 1
                Else
                    For I = 0 To Infis.Length - 1
                        If Infis(I) = "INF" Then
                            GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, New EinheitInfanterie(Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y))
                            Me.Infis += 1
                            Exit For
                        End If
                    Next
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Lässt diese KI nach einem gewissen System einen Panzer bzw. Flugzeug bauen.
    ''' </summary>
    ''' <param name="BauGebäude"></param>
    ''' <remarks></remarks>
    Private Sub CreatePanzerFlugzeuge(ByVal BauGebäude As ObjektGebäude)
        Dim Bauliste() As ObjektEinheit = {}
        If Spieler.Fonds > AllesBauSumme Then
            For Each Einheit In BauGebäude.GetBauliste(BauGebäude.Spieler)
                If BauGebäude.CanBuildUnit(Einheit) Then
                    Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(Einheit, Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y, )
                    If CanMoveAfterBuilding(E, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y) Then
                        If Objektverwalter.HatEinheitWaffen(Einheit) = True Then
                            Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(Einheit)
                            If Kosten >= BilligsterPanzer Then
                                Array.Resize(Bauliste, Bauliste.Length + 1)
                                Bauliste(Bauliste.Length - 1) = E
                            ElseIf Einheiten.Length > 20 Then
                                'wenn wir viele Truppen haben bauen wir alles.
                                Array.Resize(Bauliste, Bauliste.Length + 1)
                                Bauliste(Bauliste.Length - 1) = E
                            End If
                        ElseIf Einheit = MovementSorts.HÖLLIUM.tostring.toupper And Einheiten.Length > 15 And Zufallszahl(0, 20) = 0 Then
                            Array.Resize(Bauliste, Bauliste.Length + 1)
                            Bauliste(Bauliste.Length - 1) = E
                        End If
                    End If
                End If
            Next
        Else
            For Each Einheit In BauGebäude.GetBauliste(BauGebäude.Spieler)
                If BauGebäude.CanBuildUnit(Einheit) Then
                    If Objektverwalter.HatEinheitWaffen(Einheit) = True Then
                        Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(Einheit, Spieler.Spieler, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y, )
                        If CanMoveAfterBuilding(E, BauGebäude.Rechteck.X, BauGebäude.Rechteck.Y) Then
                            Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(Einheit)
                            If Kosten >= BilligsterPanzer And Kosten <= TeuersterPanzer Then
                                Array.Resize(Bauliste, Bauliste.Length + 1)
                                Bauliste(Bauliste.Length - 1) = E
                            End If
                        End If
                    End If
                End If
            Next
        End If
        If Bauliste.Length > 0 Then
            GebäudeAuswählen(KIModiExtern.EinheitBauen, BauGebäude, Bauliste(Zufallszahl(0, Bauliste.Length - 1)), 4)
        End If
    End Sub
    ''' <summary>
    ''' Mit dieser Funktion beenden die einfachen KI's die Runde
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub RundenEnde()
        If Spieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
            Dim GabefüllstandKO1 As Integer = Spieler.KOS(0).Gabeleiste
            Dim GabefüllstandKO2 As Integer = -1
            If IsNothing(Spieler.KOS(1)) = False Then
                GabefüllstandKO2 = Spieler.KOS(1).Gabeleiste
            End If
            If GabefüllstandKO2 >= 0 Then
                Dim MaximaleSternDifferenz As Integer = ((Spieler.KOS(0).SpezialgabeKosten + Spieler.KOS(0).Gabekosten) * Spieler.KOS(0).Sternkosten - GabefüllstandKO1) - ((Spieler.KOS(1).SpezialgabeKosten + Spieler.KOS(1).Gabekosten) * Spieler.KOS(1).Sternkosten - GabefüllstandKO2)
                If MaximaleSternDifferenz < -1000 Then
                    RundenEndeMitWechsel = True
                    Spieler.Wechsel()
                End If
            End If
        ElseIf Spieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
            If Spieler.KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                RundenEndeMitWechsel = True
                Spieler.Wechsel()
            End If
        End If
        Schleife = True
    End Sub

    Protected Overrides Function CalculateRealZiel(ByRef WSS As Wegsuchsystem, ByVal Ziel As System.Drawing.Point, ByVal Einheit As ObjektEinheit, ByRef Opfer As System.Drawing.Point) As System.Drawing.Point
        Return Ziel
    End Function
End Class
